1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # POS Membership module for OpenERP, Manage membership payments from POS.
5 # Copyright (C) 2013 L'Heureux Cyclage (<http://www.heureux-cyclage.org>)
7 # This file is a part of POS Membership
9 # POS Membership is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
14 # ReMembership is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
19 # You should have received a copy of the GNU General Public License
20 # along with this program. If not, see <http://www.gnu.org/licenses/>.
22 ##############################################################################
23 from openerp
import netsvc
24 from openerp
.osv
import fields
, osv
25 from openerp
.tools
.translate
import _
27 from datetime
import datetime
, date
28 from dateutil
.relativedelta
import relativedelta
32 ('none', 'Non Member'),
33 ('canceled', 'Cancelled Member'),
34 ('old', 'Old Member'),
35 ('waiting', 'Waiting Member'),
36 ('invoiced', 'Invoiced Member'),
37 ('free', 'Free Member'),
38 ('paid', 'Paid Member'),
41 class membership_line(osv
.osv
):
43 _inherit
= 'membership.membership_line'
45 def _get_partners(self
, cr
, uid
, ids
, context
=None):
46 list_membership_line
= []
47 member_line_obj
= self
.pool
.get('membership.membership_line')
48 for partner
in self
.pool
.get('res.partner').browse(cr
, uid
, ids
, context
=context
):
49 if partner
.member_lines
:
50 list_membership_line
+= member_line_obj
.search(cr
, uid
, [('id', 'in', [ l
.id for l
in partner
.member_lines
])], context
=context
)
51 return list_membership_line
53 def _get_membership_lines_from_account_invoice(self
, cr
, uid
, ids
, context
=None):
54 list_membership_line
= []
55 member_line_obj
= self
.pool
.get('membership.membership_line')
56 for invoice
in self
.pool
.get('account.invoice').browse(cr
, uid
, ids
, context
=context
):
57 if invoice
.invoice_line
:
58 list_membership_line
+= member_line_obj
.search(cr
, uid
, [('account_invoice_line', 'in', [ l
.id for l
in invoice
.invoice_line
])], context
=context
)
60 { 'class': 'account.invoice'
61 , 'ids': list_membership_line
63 def _get_membership_lines_from_pos_order(self
, cr
, uid
, ids
, context
=None):
64 list_membership_line
= []
65 member_line_obj
= self
.pool
.get('membership.membership_line')
66 for order
in self
.pool
.get('pos.order').browse(cr
, uid
, ids
, context
=context
):
68 list_membership_line
+= member_line_obj
.search(cr
, uid
, [('pos_order_line', 'in', [ l
.id for l
in order
.order_line
])], context
=context
)
70 { 'class': 'pos.order'
71 , 'ids': list_membership_line
74 def _check_membership_date(self
, cr
, uid
, ids
, context
=None):
75 """Check if membership product is not in the past
76 @param self: The object pointer
77 @param cr: the current row, from the database cursor,
78 @param uid: the current user’s ID for security checks,
79 @param ids: List of Membership Line IDs
80 @param context: A standard dictionary for contextual values
84 SELECT MIN(ml.date_to - ai.date_invoice)
85 FROM membership_membership_line ml
86 JOIN account_invoice_line ail ON (
87 ml.account_invoice_line = ail.id
89 JOIN account_invoice ai ON (
90 ai.id = ail.invoice_id)
91 WHERE ml.id IN %s''', (tuple(ids
),))
97 SELECT MIN(ml.date_to - ai.date_order)
98 FROM membership_membership_line ml
99 JOIN pos_order_line ail ON (
100 ml.pos_order_line = ail.id
102 JOIN pos_order ai ON (
103 ai.id = ail.order_id)
104 WHERE ml.id IN %s''', (tuple(ids
),))
107 if r
[0] and r
[0] < 0:
111 def _state(self
, cr
, uid
, data
, name
, args
, context
=None):
112 """Compute the state lines
113 @param self: The object pointer
114 @param cr: the current row, from the database cursor,
115 @param uid: the current user’s ID for security checks,
116 @param ids: List of Membership Line IDs
117 @param name: Field Name
118 @param context: A standard dictionary for contextual values
119 @param return: Dictionary of state Value
122 if data
['class'] == 'account.invoice':
123 inv_obj
= self
.pool
.get('account.invoice')
124 for line
in self
.browse(cr
, uid
, data
['ids'], context
=context
):
126 SELECT i.state, i.id FROM
130 SELECT l.invoice_id FROM
131 account_invoice_line l WHERE
133 SELECT ml.account_invoice_line FROM
134 membership_membership_line ml WHERE
139 fetched
= cr
.fetchone()
141 res
[line
.id] = 'canceled'
145 if (istate
== 'draft') |
(istate
== 'proforma'):
147 elif istate
== 'open':
149 elif istate
== 'paid':
151 # XXX: regarder l'équivalent de out_refund pour un pos.order
152 inv
= inv_obj
.browse(cr
, uid
, fetched
[1], context
=context
)
153 for payment
in inv
.payment_ids
:
154 if payment
.invoice
and payment
.invoice
.type == 'out_refund':
156 elif istate
== 'cancel':
159 elif data
['class'] == 'pos.order':
160 ord_obj
= self
.pool
.get('pos.order')
161 for line
in self
.browse(cr
, uid
, data
['ids'], context
=context
):
163 SELECT i.state, i.id FROM
167 SELECT l.order_id FROM
168 pos_order_line l WHERE
170 SELECT ml.pos_order_line FROM
171 membership_membership_line ml WHERE
176 fetched
= cr
.fetchone()
178 res
[line
.id] = 'canceled'
182 if (ostate
== 'draft'):
184 elif (ostate
== 'paid') |
(ostate
== 'done') |
(ostate
== 'invoiced'):
186 # XXX: regarder l'équivalent de out_refund pour un pos.order
187 print("DEV: [pos_membership] [membership_line] [_state]: paid: TODO"),
188 #inv = ord_obj.browse(cr, uid, fetched[1], context=context)
189 #for payment in inv.payment_ids:
190 # if payment.invoice and payment.invoice.type == 'out_refund':
192 elif ostate
== 'cancel':
198 'pos_order_line': fields
.many2one('pos.order.line', 'POS Order line', readonly
=True),
199 'pos_order_id': fields
.related('pos_order_line', 'order_id', type='many2one', relation
='pos.order', string
='Order', readonly
=True),
200 'state': fields
.function(_state
,
201 string
='Membership Status', type='selection',
204 'account.invoice': (_get_membership_lines_from_account_invoice
, ['state'], 10),
205 'pos.order': (_get_membership_lines_from_pos_order
, ['state'], 10),
206 'res.partner': (_get_partners
, ['membership_state'], 12),
207 }, help="""It indicates the membership status.
208 -Non Member: A member who has not applied for any membership.
209 -Cancelled Member: A member who has cancelled his membership.
210 -Old Member: A member whose membership date has expired.
211 -Waiting Member: A member who has applied for the membership and whose invoice is going to be created.
212 -Invoiced Member: A member whose invoice has been created.
213 -Paid Member: A member who has paid the membership amount."""),
214 'company_id': fields
.related('account_invoice_line', 'invoice_id', 'company_id', type="many2one", relation
="res.company", string
="Company", readonly
=True, store
=True)
215 # XXX: pos_order_line a aussi un company_id
220 class Partner(osv
.osv
):
222 _inherit
= 'res.partner'
224 def _get_partner_id(self
, cr
, uid
, ids
, context
=None):
225 member_line_obj
= self
.pool
.get('membership.membership_line')
226 res_obj
= self
.pool
.get('res.partner')
227 data_inv
= member_line_obj
.browse(cr
, uid
, ids
, context
=context
)
229 for data
in data_inv
:
230 list_partner
.append(data
.partner
.id)
233 ids2
= res_obj
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
237 def _get_invoice_partner(self
, cr
, uid
, ids
, context
=None):
238 inv_obj
= self
.pool
.get('account.invoice')
239 res_obj
= self
.pool
.get('res.partner')
240 data_inv
= inv_obj
.browse(cr
, uid
, ids
, context
=context
)
242 for data
in data_inv
:
243 list_partner
.append(data
.partner_id
.id)
246 ids2
= res_obj
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
250 def _get_order_partner(self
, cr
, uid
, ids
, context
=None):
251 ord_obj
= self
.pool
.get('pos.order')
252 res_obj
= self
.pool
.get('res.partner')
253 data_ord
= ord_obj
.browse(cr
, uid
, ids
, context
=context
)
255 for data
in data_ord
:
256 list_partner
.append(data
.partner_id
.id)
259 ids2
= res_obj
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
263 def _membership_state(self
, cr
, uid
, ids
, name
, args
, context
=None):
264 """This Function return Membership State For Given Partner.
265 @param self: The object pointer
266 @param cr: the current row, from the database cursor,
267 @param uid: the current user’s ID for security checks,
268 @param ids: List of Partner IDs
269 @param name: Field Name
270 @param context: A standard dictionary for contextual values
271 @param return: Dictionary of Membership state Value
276 today
= time
.strftime('%Y-%m-%d')
278 partner_data
= self
.browse(cr
, uid
, id, context
=context
)
279 if partner_data
.membership_cancel
and today
> partner_data
.membership_cancel
:
282 if partner_data
.membership_stop
and today
> partner_data
.membership_stop
:
286 if partner_data
.member_lines
:
287 for mline
in partner_data
.member_lines
:
288 if mline
.date_to
>= today
:
289 if mline
.account_invoice_line
and mline
.account_invoice_line
.invoice_id
:
290 mstate
= mline
.account_invoice_line
.invoice_id
.state
293 inv
= mline
.account_invoice_line
.invoice_id
294 for payment
in inv
.payment_ids
:
295 if payment
.invoice
.type == 'out_refund':
298 elif mstate
== 'open' and s
!=0:
300 elif mstate
== 'cancel' and s
!=0 and s
!=1:
302 elif (mstate
== 'draft' or mstate
== 'proforma') and s
!=0 and s
!=1:
304 elif mline
.order_pos_line
and mline
.order_pos_line
.order_id
:
305 mstate
= mline
.pos_order_line
.order_id
.state
306 if (mstate
== 'paid') |
(mstate
== 'done') |
(mstate
== 'paid'):
308 # XXX: regarder l'équivalent de out_refund pour un pos.order
309 print("DEV: [pos_membership] [partner] [_membership_state]: paid: TODO"),
310 #inv = mline.pos_order_line.order_id
311 #for payment in inv.payment_ids:
312 # if payment.invoice.type == 'out_refund':
315 elif mstate
== 'open' and s
!=0:
316 # XXX: 1 donne invoiced, c'est pitet pas bon
317 print("DEV: [pos_membership] [partner] [_membership_state]: invoiced: TODO"),
319 elif mstate
== 'cancel' and s
!=0 and s
!=1:
321 elif mstate
== 'draft' and s
!=0 and s
!=1:
324 for mline
in partner_data
.member_lines
:
325 if mline
.date_from
< today
and \
326 mline
.date_to
< today
and \
327 mline
.date_from
<= mline
.date_to
and \
328 ( (mline
.account_invoice_line
and mline
.account_invoice_line
.invoice_id
.state
) == 'paid' or \
329 ( mline
.pos_order_line
and \
330 ( mline
.pos_order_line
.order_id
.state
== 'paid' or \
331 mline
.pos_order_line
.order_id
.state
== 'done' or \
332 mline
.pos_order_line
.order_id
.state
== 'invoiced' ))):
348 if partner_data
.free_member
and s
!=0:
350 if partner_data
.associate_member
:
351 res_state
= self
._membership
_state
(cr
, uid
, [partner_data
.associate_member
.id], name
, args
, context
=context
)
352 res
[id] = res_state
[partner_data
.associate_member
.id]
355 def _membership_date(self
, cr
, uid
, ids
, name
, args
, context
=None):
356 """Return date of membership"""
359 member_line_obj
= self
.pool
.get('membership.membership_line')
360 for partner
in self
.browse(cr
, uid
, ids
, context
=context
):
361 if partner
.associate_member
:
362 partner_id
= partner
.associate_member
.id
364 partner_id
= partner
.id
366 'membership_start': False,
367 'membership_stop': False,
368 'membership_cancel': False
370 if name
== 'membership_start':
371 line_id
= member_line_obj
.search(cr
, uid
, [('partner', '=', partner_id
),('date_cancel','=',False)],
372 limit
=1, order
='date_from', context
=context
)
374 res
[partner
.id]['membership_start'] = member_line_obj
.read(cr
, uid
, line_id
[0],
375 ['date_from'], context
=context
)['date_from']
377 if name
== 'membership_stop':
378 line_id1
= member_line_obj
.search(cr
, uid
, [('partner', '=', partner_id
),('date_cancel','=',False)],
379 limit
=1, order
='date_to desc', context
=context
)
381 res
[partner
.id]['membership_stop'] = member_line_obj
.read(cr
, uid
, line_id1
[0],
382 ['date_to'], context
=context
)['date_to']
384 if name
== 'membership_cancel':
385 if partner
.membership_state
== 'canceled':
386 line_id2
= member_line_obj
.search(cr
, uid
, [('partner', '=', partner
.id)], limit
=1, order
='date_cancel', context
=context
)
388 res
[partner
.id]['membership_cancel'] = member_line_obj
.read(cr
, uid
, line_id2
[0], ['date_cancel'], context
=context
)['date_cancel']
391 def _get_partners(self
, cr
, uid
, ids
, context
=None):
394 ids2
= self
.search(cr
, uid
, [('associate_member', 'in', ids2
)], context
=context
)
398 def __get_membership_state(self
, *args
, **kwargs
):
399 return self
._membership
_state
(*args
, **kwargs
)
402 'associate_member': fields
.many2one('res.partner', 'Associate Member',help="A member with whom you want to associate your membership.It will consider the membership state of the associated member."),
403 'member_lines': fields
.one2many('membership.membership_line', 'partner', 'Membership'),
404 'free_member': fields
.boolean('Free Member', help = "Select if you want to give free membership."),
405 'membership_amount': fields
.float(
406 'Membership Amount', digits
=(16, 2),
407 help = 'The price negotiated by the partner'),
408 'membership_state': fields
.function(
409 __get_membership_state
,
410 string
= 'Current Membership Status', type = 'selection',
413 'account.invoice': (_get_invoice_partner
, ['state'], 10),
414 'pos.order': (_get_order_partner
, ['state'], 10),
415 'membership.membership_line': (_get_partner_id
, ['state'], 10),
416 'res.partner': (_get_partners
, ['free_member', 'membership_state', 'associate_member'], 10)
417 }, help="""It indicates the membership state.
418 -Non Member: A partner who has not applied for any membership.
419 -Cancelled Member: A member who has cancelled his membership.
420 -Old Member: A member whose membership date has expired.
421 -Waiting Member: A member who has applied for the membership and whose invoice is going to be created.
422 -Invoiced Member: A member whose invoice has been created.
423 -Paying member: A member who has paid the membership fee."""),
424 'membership_start': fields
.function(
425 _membership_date
, multi
= 'membeship_start',
426 string
= 'Membership Start Date', type = 'date',
428 'account.invoice': (_get_invoice_partner
, ['state'], 10),
429 'pos.order': (_get_order_partner
, ['state'], 10),
430 'membership.membership_line': (_get_partner_id
, ['state'], 10, ),
431 'res.partner': (lambda self
, cr
, uid
, ids
, c
={}: ids
, ['free_member'], 10)
432 }, help="Date from which membership becomes active."),
433 'membership_stop': fields
.function(
435 string
= 'Membership End Date', type='date', multi
='membership_stop',
437 'account.invoice': (_get_invoice_partner
, ['state'], 10),
438 'pos.order': (_get_order_partner
, ['state'], 10),
439 'membership.membership_line': (_get_partner_id
, ['state'], 10),
440 'res.partner': (lambda self
, cr
, uid
, ids
, c
={}: ids
, ['free_member'], 10)
441 }, help="Date until which membership remains active."),
442 'membership_cancel': fields
.function(
444 string
= 'Cancel Membership Date', type='date', multi
='membership_cancel',
446 'account.invoice': (_get_invoice_partner
, ['state'], 11),
447 'pos.order': (_get_order_partner
, ['state'], 11),
448 'membership.membership_line': (_get_partner_id
, ['state'], 10),
449 'res.partner': (lambda self
, cr
, uid
, ids
, c
={}: ids
, ['free_member'], 10)
450 }, help="Date on which membership has been cancelled"),
455 class pos_order(osv
.osv
):
456 _inherit
= 'pos.order'
458 def _check_membership_product(self
, cr
, uid
, ids
, context
=None):
459 #TODO : check condition and return boolean accordingly
460 if not context
is None:
462 order_line_obj
= self
.pool
.get('pos.order.line')
463 data_order_line
= order_line_obj
.browse(cr
, uid
, ids
, context
=context
)
464 for data
in data_order_line
:
465 print("DEV: [pos_membership] [_check_membership_product] [order_line]: data=%s product=%s" % (str(data
.id), str(data
.product_id
))),
469 (_check_membership_product
, 'Error: Invalid Message', ['field_name']),
472 # XXX: copied from openerp/addons/point_of_sale/point_of_sale.py
473 def action_invoice(self
, cr
, uid
, ids
, context
=None):
474 print ("DEV: [pos_membership] [pos_order] [action_invoice]");
475 wf_service
= netsvc
.LocalService("workflow")
476 inv_ref
= self
.pool
.get('account.invoice')
477 inv_line_ref
= self
.pool
.get('account.invoice.line')
478 product_obj
= self
.pool
.get('product.product')
481 for order
in self
.pool
.get('pos.order').browse(cr
, uid
, ids
, context
=context
):
483 inv_ids
.append(order
.invoice_id
.id)
486 if not order
.partner_id
:
487 raise osv
.except_osv(_('Error!'), _('Please provide a partner for the sale.'))
489 acc
= order
.partner_id
.property_account_receivable
.id
490 # XXX: copied from openerp/addons/point_of_sale/point_of_sale.py to fix account.invoice.line creation
493 'origin': order
.name
,
495 'journal_id': order
.sale_journal
.id or None,
496 'type': 'out_invoice',
497 'reference': order
.name
,
498 'partner_id': order
.partner_id
.id,
499 'comment': order
.note
or '',
500 'currency_id': order
.pricelist_id
.currency_id
.id, # considering partner's sale pricelist's currency
503 inv
.update(inv_ref
.onchange_partner_id(cr
, uid
, [], 'out_invoice', order
.partner_id
.id)['value'])
504 if not inv
.get('account_id', None):
505 inv
['account_id'] = acc
506 for line
in order
.lines
:
508 #'invoice_id': inv_id,
509 'product_id': line
.product_id
.id,
510 'quantity': line
.qty
,
512 inv_name
= product_obj
.name_get(cr
, uid
, [line
.product_id
.id], context
=context
)[0][1]
513 inv_line
.update(inv_line_ref
.product_id_change(cr
, uid
, [],
515 line
.product_id
.uom_id
.id,
516 line
.qty
, partner_id
= order
.partner_id
.id,
517 fposition_id
=order
.partner_id
.property_account_position
.id)['value'])
518 if line
.product_id
.description_sale
:
519 inv_line
['note'] = line
.product_id
.description_sale
520 inv_line
['price_unit'] = line
.price_unit
521 inv_line
['discount'] = line
.discount
522 inv_line
['name'] = inv_name
523 inv_line
['invoice_line_tax_id'] = ('invoice_line_tax_id' in inv_line
)\
524 and [(6, 0, inv_line
['invoice_line_tax_id'])] or []
525 #inv_line_ref.create(cr, uid, inv_line, context=context)
526 inv
['invoice_line'].append((0, 0, inv_line
))
527 inv_id
= inv_ref
.create(cr
, uid
, inv
, context
=context
)
529 self
.write(cr
, uid
, [order
.id], {'invoice_id': inv_id
, 'state': 'invoiced'}, context
=context
)
530 inv_ref
.confirm_paid(cr
, uid
, [inv_id
], context
=context
)
531 inv_ids
.append(inv_id
)
532 inv_ref
.button_reset_taxes(cr
, uid
, [inv_id
], context
=context
)
533 wf_service
.trg_validate(uid
, 'pos.order', order
.id, 'invoice', cr
)
535 if not inv_ids
: return {}
537 mod_obj
= self
.pool
.get('ir.model.data')
538 res
= mod_obj
.get_object_reference(cr
, uid
, 'account', 'invoice_form')
539 res_id
= res
and res
[1] or False
541 'name': _('Customer Invoice'),
545 'res_model': 'account.invoice',
546 'context': "{'type':'out_invoice'}",
547 'type': 'ir.actions.act_window',
550 'res_id': inv_ids
and inv_ids
[0] or False,
555 class pos_order_line(osv
.osv
):
556 _inherit
= 'pos.order.line'
558 def write(self
, cr
, uid
, ids
, vals
, context
=None):
559 member_line_obj
= self
.pool
.get('membership.membership_line')
560 res
= super(pos_order_line
, self
).write(cr
, uid
, ids
, vals
, context
=context
)
561 for line
in self
.browse(cr
, uid
, ids
, context
=context
):
562 ml_ids
= member_line_obj
.search(cr
, uid
, [('pos_order_line', '=', line
.id)], context
=context
)
563 if line
.product_id
and line
.product_id
.membership
:
564 member_line_id
= member_line_obj
.search(cr
, uid
565 , [('partner' , '=', line
.order_id
.partner_id
.id)
566 ,('pos_order_line', '=', line
.id)]
569 for member_line
in member_line_obj
.browse(cr
, uid
, member_line_id
, context
=context
):
570 # NOTE: get member_line created in membership.pos_order_line.create
571 date_from
= member_line
.date_from
572 date_to
= member_line
.date_to
573 if line
.product_id
.membership_date2date
:
574 date_from
= ('date_from' in context
575 and context
['date_from']
576 and datetime
.strptime(context
['date_from'], "%Y-%m-%d")
578 date_to
= date_from
+ relativedelta(months
= +12) # TODO: parameterize this delta?
579 date_from
= date_from
.strftime("%Y-%m-%d")
580 date_to
= date_to
.strftime("%Y-%m-%d")
581 print ("DEV: [pos_membership] [write] date_from: %s" % str(date_from
))
582 print ("DEV: [pos_membership] [write] date_to : %s" % str(date_to
))
583 member_line_obj
.write(cr
, uid
, member_line
.id
584 , {'date_from': date_from
588 if line
.product_id
.membership_grouped
:
589 if line
.order_id
.partner_id
.associate_members
:
590 associate_member_line_ids
= member_line_obj
.search(cr
, uid
591 , [ ('pos_order_line', '=', line
.id)
592 , ('partner', '!=', line
.order_id
.partner_id
.id)
595 for associate_member_line
in member_line_obj
.browse(cr
, uid
, associate_member_line_ids
, context
=context
):
596 print ("DEV: [pos_membership] [write] [associate] date_from: %s" % str(date_from
))
597 print ("DEV: [pos_membership] [write] [associate] date_to : %s" % str(date_to
))
598 member_line_obj
.write(cr
, uid
, associate_member_line
.id
599 , {'date_from': date_from
604 print("DEV: mettre une contrainte pour l'objet\
605 membership.membership_line interdisant les\
606 adhésions groupées reliées à des partenaires\
607 sans membres associés")
609 associate_member_line_ids
= member_line_obj
.search(cr
, uid
610 , [ ('pos_order_line', '=', line
.id)
611 , ('partner', '!=', line
.order_id
.partner_id
.id)
614 member_line_obj
.unlink(cr
, uid
, associate_member_line_ids
, context
=context
)
616 #Define member ident if it's necessary
617 partners
= [line
.order_id
.partner_id
]
618 if line
.order_id
.partner_id
.associate_members
:
619 partners
.extend(line
.order_id
.partner_id
.associate_members
)
621 if not i
.member_ident
:
622 mbr_id
= self
.pool
.get('ir.sequence').get(cr
, uid
, 'member_ident')
623 self
.pool
.get('res.partner').write(cr
, uid
, i
.id, {'member_ident': mbr_id
})
624 if line
.product_id
and not line
.product_id
.membership
and ml_ids
:
625 # Product line has changed to a non membership product
626 member_line_obj
.unlink(cr
, uid
, ml_ids
, context
=context
)
629 def create(self
, cr
, uid
, vals
, context
=None):
630 member_line_obj
= self
.pool
.get('membership.membership_line')
631 res
= super(pos_order_line
, self
).create(cr
, uid
, vals
, context
=context
)
632 line
= self
.browse(cr
, uid
, res
, context
=context
)
634 if line
.product_id
and line
.product_id
.membership
:
635 member_line_id
= member_line_obj
.search(cr
, uid
636 , [('partner' , '=', line
.order_line
.partner_id
.id)
637 ,('pos_order_line', '=', line
.id)]
640 for member_line
in member_line_obj
.browse(cr
, uid
, member_line_id
, context
=context
):
641 # NOTE: get member_line created in membership.pos_order_line.create
642 date_from
= member_line
.date_from
643 date_to
= member_line
.date_to
644 if line
.product_id
.membership_date2date
:
645 date_from
= ('date_from' in context
646 and context
['date_from']
647 and datetime
.strptime(context
['date_from'], "%Y-%m-%d")
649 date_to
= date_from
+ relativedelta(days
= +364) # TODO: parameterize this delta?
650 date_from
= date_from
.strftime("%Y-%m-%d")
651 date_to
= date_to
.strftime("%Y-%m-%d")
652 print ("DEV: [pos_membership] [create] date_from: %s" % str(date_from
))
653 print ("DEV: [pos_membership] [create] date_to : %s" % str(date_to
))
654 member_line_obj
.write(cr
, uid
, member_line
.id
655 , {'date_from': date_from
659 partners
= [line
.order_line
.partner_id
]
660 if line
.product_id
.membership_grouped
and line
.order_line
.partner_id
.associate_members
:
661 partners
.extend(line
.order_line
.partner_id
.associate_members
)
662 #Adding membership lines just for associate partners
663 for associate_member
in line
.order_line
.partner_id
.associate_members
:
664 print ("DEV: [pos_membership] [create] [associate] date_from: %s" % str(date_from
))
665 print ("DEV: [pos_membership] [create] [associate] date_to : %s" % str(date_to
))
666 member_line_obj
.create(cr
, uid
, {
667 'partner': associate_member
.id,
668 'membership_id': line
.product_id
.id,
669 'member_price': line
.price_unit
,
670 'date': time
.strftime('%Y-%m-%d'),
671 'date_from': date_from
,
673 'pos_order_line': line
.id,
675 elif line
.product_id
.membership_grouped
and not line
.order_line
.partner_id
.associate_members
:
676 raise osv
.except_osv(_('Error!!!'), _('You try to order grouped membership product to a partner who hasn\'t associated partners.'))
677 #Define member ident if it's necessary
679 if not i
.member_ident
:
680 mbr_id
= self
.pool
.get('ir.sequence').get(cr
, uid
, 'member_ident')
681 self
.pool
.get('res.partner').write(cr
, uid
, i
.id, {'member_ident': mbr_id
})
686 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: